Redo log和Undo log

Redo Log

提升性能

为了提高数据库的性能,InnoDB使用缓冲池(Buffer Pool),实现了磁盘和流的映射,提高了读写效率;
在读取数据的时候会优先在缓冲池(Buffer Pool)里读取,如果没有对应数据就从磁盘获取并添加到缓冲池(Buffer Pool);
在写入数据的时候会写入缓冲池(Buffer Pool),定期同步到磁盘;

事务特性之持久化

重做日志(Redo Log)是在崩溃恢复期间使用的基于磁盘的数据结构,用于纠正事务不完整写入的数据。
当一个事务提交重做日志(Redo Log)时,它已经完成了对数据的修改,并在提交重做日志(Redo Log)之后提交事务,
这样保证了事务提交的时候重做日志(Redo Log)必然存在,即使MySQL发生崩溃也可以根据重做日志(Redo Log)进行恢复。

对应配置

如果需要对重做日志(Redo Log)进行优化,需要进行以下步骤:

  1. 关闭数据库
  2. 修改my.cnf文件
  3. 调整配置,可以选择以下配置进行修改和优化
    1. innodb_log_file_size,指定日志文件的大小
    2. innodb_log_files_in_group,指定日志文件的数量
  4. 重启数据库

当重启完毕后,InnoDB会检测到innodb_log_file_size大小和当前配置不同,
它将编写日志检查点,关闭并删除旧的文件,按配置的大小创建新的文件,然后打开新的日志文件。

Undo Logs

简介

撤消日志(Undo Logs)是与单个读写事务关联的撤消日志记录的集合
撤消日志(Undo Logs)记录包含有关如何撤消事务聚簇索引记录的最新更改的信息。
如果另一个事务需要将原始数据视为一致读取操作的一部分,则将从撤消日志(Undo Logs)记录中检索未修改的数据。

结构描述

撤消日志(Undo Logs)存在于撤消日志段(undo log segments)中,它包含在回滚段(rollback segments)中;
回滚段(rollback segments)位于撤销表空间(undo tablespaces)和全局临时表空间(global temporary tablespace)中;

全局临时表空间(global temporary tablespace)中存在的撤消日志(Undo Logs)没有重做日志(Redo Log),
因为它只用于运行时的数据回滚,所以恢复这些数据没有意义,不记录对应的重做日志(Redo Log)反而降低了I/O。

每个撤销表空间(undo tablespaces)和全局临时表空间(global temporary tablespace)支持最多128个回滚段(rollback segments)。
回滚段(rollback segments)支持的事务数取决于回滚段(rollback segments)中的撤消插槽数和每个事务所需的撤消日志(Undo Logs)数。
回滚段(rollback segments)中撤消插槽的数量根据InnoDB页面大小而有所不同。

InnoDB页面大小 回滚段中的撤消插槽数(InnoDB页面大小/ 16)
4096 (4KB) 256
8192 (8KB) 512
16384 (16KB) 1024
32768 (32KB) 2048
65536 (64KB) 4096

一个事务最多分配四个撤消日志(Undo Logs),以下每种操作类型都可以分配一个:

  1. INSERT用户定义表上的操作
  2. UPDATE和DELETE用户定义表上的操作
  3. INSERT用户定义的临时表上的操作
  4. UPDATE和DELETE用户定义的临时表上的操作

撤消日志(Undo Logs)根据需要分配,例如,对用户自定义表和临时表上执行INSERT、UPDATE和DELETE
操作需要完全分配四个撤销日志,仅对用户自定义表进行INSERT操作,则只需要单个日志。

分配给事务的撤消日志(Undo Logs)在其持续时间内始终与事务有关,
例如:为INSERT常规表上的操作分配给事务的撤消日志(Undo Logs)将用于INSERT由该事务执行的常规表上的所有操作。

根据Undo Logs计算并发读写事务数

这是一个不错的技巧,我们可以根据数据库配置来估算我们的事务大概可以支持多少并发,虽然在实际情况中运行着不同的SQL语句,导致这个数通常不是准确的。

如果每个事务执行一次INSERT一次UPDATE一次DELETE

(innodb_page_size / 16) 回滚段innodb_rollback_segments 撤销表空间 undo tablespaces

如果每个事务执行一次INSERT(一次UPDATE一次DELETE)

(innodb_page_size / 16 / 2) 回滚段innodb_rollback_segments 撤销表空间 undo tablespaces

如果每个事务执行一次INSERT临时表操作

(innodb_page_size / 16) * 回滚段innodb_rollback_segments

如果每个事务执行一次INSERT(一次UPDATE一次DELETE)

(innodb_page_size / 16 / 2) * 回滚段innodb_rollback_segments